package listener;

import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;

@WebListener
public class ContextFinalizerListener implements ServletContextListener {

    public ContextFinalizerListener() {
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("webService start");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("webService stop");
        //Enumeration接口中定义了一些方法，通过这些方法可以枚举（一次获得一个）对象集合中的元素。
        Enumeration<Driver> drivers= DriverManager.getDrivers();
        Driver driver=null;
        //手动注销驱动
        // 	boolean hasMoreElements( )测试此枚举是否包含更多的元素。
        while(drivers.hasMoreElements()){
            try{
                //Object nextElement( )如果此枚举对象至少还有一个可提供的元素，则返回此枚举的下一个元素。
                driver=drivers.nextElement();
                // DriverManager类位于java.sql包中，是用来管理JDBC驱动程序的基本服务。deregisterDriver方法用于从列表中删除一个驱动程序。
                DriverManager.deregisterDriver(driver);
                System.out.println(String.format("ContextFinalizer:Driver %s deregistered", driver));
            } catch (SQLException e) {
                System.out.println(String.format("ContextFinalizer:Error deregistering driver %s", driver) + ":" + e);
            }
        }
        //关闭AbandonedConnectionCleanupThread线程
        AbandonedConnectionCleanupThread.checkedShutdown();
        System.out.println("clean thread success");
    }

}
